#ifndef BLOQUE_H_
#define BLOQUE_H_

#include "Componente.h"
#include "Compuesto.h"
#include "../Constantes.h"

class Bytes;
class Registro;
class RegistroVariable;
class TipoClave;
class Key;

class Bloque : public Componente, public Compuesto {

protected:
	cantBytes tamanio;
	cantBytes usados;

public:

	/*
	 * Pre: -
	 * Pos: crea una nueva instancia de bloque del tamanio pasado por argumento.
	 */
	Bloque(cantBytes tamanio);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~Bloque();

	/*
	 * Pre: -
	 * Pos: serializa el estado del bloque.
	 */
	virtual Bytes serializarse();

	/*
	 * Pre: bytes validos.
	 * Pos: hidrata el estado del bloque.
	 */
	virtual void hidratarse(const Bytes& bytes);

	/*
	 * Pre: tamanio de registro valido.
	 * Pos: agrega el registro al bloque.
	 */
	bool agregarRegistro(RegistroVariable* registro);

	/*
	 * Pre:-
	 * Pos: devuelve true en caso de que el bloque tenga al menos "tamanioDelNuevo" bytes disponibles.
	 */
	virtual bool tieneLugar(RegistroVariable* registro);

	/*
	 * Pre: -
	 * Pos: Devuelve el dato relacionado con la clave. Si no esta devuelve una clave vacia.
	 */
	Bytes obtener(Bytes clave, TipoClave* extractor);

	/*
	 * Pre: -
	 * Pos: elimina el registro relacionado con la clave. Si no esta la clave devuelve false
	 */
	virtual bool eliminar(Bytes clave, TipoClave* extractor);

	/*
	 * Pre: -
	 * Pos: devuelve el tamanio del bloque serializado.
	 */
	virtual cantBytes getTamanioSerializado();
};

#endif /* BLOQUE_H_ */
